package cn.lhl.config;

import com.alibaba.fastjson2.support.spring.data.redis.GenericFastJsonRedisSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;

/**
 * 完成对Redis的整合的一些配置
 */
@Configuration
public class RedisConf {
	/**
	 * 创建RedisTemplate:用于执行Redis操作的方法
	 */
	@Bean
	public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
		RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
		// 设置 RedisConnection 工厂。 它就是实现多种 Java Redis 客户端接入的秘密工厂
		redisTemplate.setConnectionFactory(factory);

		//使用Jackson2JsonRedisSerialize替换默认序列化
//		ObjectMapper om = new ObjectMapper();
//		// 指定要序列化的域，field,get和set,以及修饰符范围，ANY是都有包括private和public
//		om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//		// 指定序列化输入的类型，类必须是非final修饰的，final修饰的类，比如String,Integer等会跑出异常
//		om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance , ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
//		om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //忽略未知的字段
//		GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(om);

		//使用GenericFastJsonRedisSerializer替换默认序列化   需要fastjson2-extension-spring5包
		GenericFastJsonRedisSerializer jackson2JsonRedisSerializer = new GenericFastJsonRedisSerializer();

		//设置通用序列化器
		// 使用 String 序列化方式，序列化 KEY 。
		redisTemplate.setKeySerializer(RedisSerializer.string());
		// 使用 JSON 序列化方式（库是 Jackson ），序列化 VALUE 。
		redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);

		// 使用 String 序列化方式，序列化 KEY 。
		redisTemplate.setHashKeySerializer(RedisSerializer.string());
		// 使用 JSON 序列化方式（库是 Jackson ），序列化 VALUE 。
		redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
		return redisTemplate;
	}
}
